/*
 * Copyright (c) 2025, 大连理工大学 (Dalian University of Technology)
 *
 * Licensed under the Mulan PSL v2.
 * You can use this file according to the terms and conditions of the Mulan PSL v2.
 * You may obtain a copy of the License at
 *
 *     http://license.coscl.org.cn/MulanPSL2
 *
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. SEE THE MULAN PSL v2
 * FOR MORE DETAILS.
 */

#pragma once

#include <vector>

#include "highfive/H5File.hpp"

#include "DataStructure/Common/Id.h"
#include "DataStructure/Common/Integer.h"
#include "DataStructure/Input/Constraint/ConstraintType.h"

#include "DBManager/IRepository/Input/Constraint/IConstraintSummaryRepository.h"
#include "DBManager/Repository/HDF5/Base/SingleRepositoryBase.h"

template <>
inline HighFive::DataType HighFive::create_datatype<SG::DBManager::SummaryIDENTITY> ()
{
    HighFive::CompoundType compoundType = {
        { "SID", HighFive::create_datatype<SG::DataStructure::Common::I64> () },
        { "BEGIN", HighFive::create_datatype<SG::DataStructure::Common::I64> () },
        { "LENGTH", HighFive::create_datatype<SG::DataStructure::Common::I64> () },

    };
    return compoundType;
}
SG_DBMANAGER_HDF5_NAMESPACE_OPEN
class ConstraintSummaryRepository : public IConstraintSummaryRepository,
                                    public MainlyRepositoryBase<SG::DBManager::MultiSummaryInfo<SG::DataStructure::FEM::ConstraintType>>
{
  public:
    explicit ConstraintSummaryRepository (HDF5Database& database);

    std::vector<SG::DBManager::MultiSummaryInfo<SG::DataStructure::FEM::ConstraintType>> GetAllData () override;

    std::vector<SG::DataStructure::FEM::ConstraintType> GetType (SG::DataStructure::Common::Id sid) override;

    enum DATASET : std::uint8_t
    {
        MainDataset,
        IndexDataset,
        SubDataset
    };

    /**
     * @brief   : 初始化表数据
     * @author  : ql
     */
    void InitialDatasetInfo () override;

    /**
     * @brief   : 初始化该表数据
     */
    void InitDataset () override;

    /**
     * @brief   : 将缓存数据转储到文件内
     */
    void DumpWriteCahce () override;

    /**
     * @brief   : 加载文件数据至缓存
     * @param   : ConstraintIndex
     */
    std::vector<DataType>* LoadReadCache (std::size_t ConstraintIndex) override;

    /**
     * @brief   : 对数据进行排序
     */
    void SortData () override;

    /**
     * @brief   : 将自己的数据转存为nastran的数据结构
     */
    void OwnToNastran (std::vector<SG::DBManager::MultiSummaryInfo<SG::DataStructure::FEM::ConstraintType>>& own,
                       std::vector<SG::DBManager::SummaryIDENTITY>& _OUT                                     IDENTITYData,
                       std::vector<SG::DataStructure::Common::I8>& _OUT                                      subData,
                       bool                                                                                  isSort = false);

    /**
     * @brief   : 将NASTRAN的数据转存为自己的数据结构
     * @param   : IDENTITYData
     * @param   : subData
     * @param   : own
     */
    void NastranToOwn (std::vector<SG::DBManager::SummaryIDENTITY>&                                               IDENTITYData,
                       std::vector<SG::DataStructure::Common::I8>&                                                subData,
                       std::vector<SG::DBManager::MultiSummaryInfo<SG::DataStructure::FEM::ConstraintType>>& _OUT own);
};
SG_DBMANAGER_HDF5_NAMESPACE_CLOSE
